#include <gflags/gflags.h>

#include <memory>
#include <string>
#include <thread>

#include "../../common/etcd.h"
#include "../../common/log.h"

DEFINE_int32(level, 1, "日志等级");
DEFINE_bool(mode, false, "调试模式-false, 发布模式-true");
DEFINE_string(path, "./logfile", "发布模式下日志输出到的文件路径");

DEFINE_string(etcd_host, "http://127.0.0.1:2379", "etcd服务器地址");
DEFINE_string(base_service, "/service", "服务监控根目录");
DEFINE_string(instance_name, "/user/instance", "当前实例名称");
DEFINE_string(access_host, "127.0.0.1:8080", "当前实例的外部访问地址");

void put_cb(std::string service_name, std::string service_host) {
    LOG_DEBUG("上线服务: {}-{}", service_name, service_host);
}

void del_cb(std::string service_name, std::string service_host) {
    LOG_DEBUG("下线服务: {}-{}", service_name, service_host);
}

int main(int argc, char* argv[]) {
    gflags::ParseCommandLineFlags(&argc, &argv, true);
    initLogger(FLAGS_level, FLAGS_mode, FLAGS_path);

    auto discovery = std::make_shared<Discovery>(FLAGS_etcd_host, FLAGS_base_service,
                                                 put_cb, del_cb);

    std::this_thread::sleep_for(std::chrono::seconds(1000));

    return 0;
}

// #include <etcd/Client.hpp>
// #include <etcd/KeepAlive.hpp>
// #include <etcd/Response.hpp>
// #include <etcd/Value.hpp>
// #include <etcd/Watcher.hpp>

// #include "../spdlog/log.h"

// void callback(const etcd::Response& resp) {
//     if (resp.is_ok() == false) {
//         LOG_ERROR("收到一个错误事件通知 {}", resp.error_message());
//         return;
//     }

//     for (auto& ev : resp.events()) {
//         if (ev.event_type() == etcd::Event::EventType::PUT) {
//             LOG_DEBUG("服务信息发生了改变");
//             LOG_DEBUG("当前的值: {}-{}", ev.kv().key(), ev.kv().as_string());
//             LOG_DEBUG("原来的值: {}-{}", ev.prev_kv().key(),
//                       ev.prev_kv().as_string());

//         } else if (ev.event_type() == etcd::Event::EventType::DELETE_) {
//             LOG_DEBUG("服务信息下线被删除");
//             LOG_DEBUG("原来的值: {}-{}", ev.prev_kv().key(),
//                       ev.prev_kv().as_string());
//         }
//     }
// }

// int main() {
//     initLogger(1, false, "log.file");

//     const std::string etcd_host = "http://127.0.0.1:2379";

//     // 1. 实例化客户端对象
//     etcd::Client client(etcd_host);

//     // 2. 获取指定的键值对信息
//     auto resp = client.ls("/source").get();
//     if (resp.is_ok() == false) {
//         LOG_ERROR("获取键值对数据失败 {}", resp.error_message());
//         return -1;
//     }

//     int size = resp.keys().size();
//     for (int i = 0; i < size; ++i) {
//         LOG_DEBUG("{} 可以提供 {} 服务", resp.value(i).as_string(),
//                   resp.key(i));
//     }

//     // 3. 创建监控对象
//     auto watcher = etcd::Watcher(client, "/source", callback, true);
//     watcher.Wait();

//     return 0;
// }